#ifndef __MECASOL_CL_H
#define __MECASOL_CL_H


///////////////////////////////////////////////////////////////////
#define ADD_MARKER(s) (s,#s)                    \
    /**/
#define MARKER_LIST                             \
    ( 3, (  ADD_MARKER(Exterieur),              \
            ADD_MARKER(Interieur),              \
            ADD_MARKER(Fixe)                    \
            )                                   \
      )                                         \
    /**/
///////////////////////////////////////////////////////////////////
#include <research/life-workspace/Fluid-Structure/cldata.hpp>
///////////////////////////////////////////////////////////////////
#if 0
#define CL_DEF_MECASOL(TIME)                                            \
    addCL<cl::dirichlet_vec,cl::Interieur>( -vf::sin( TIME*M_PI/(0.7*2.) )*0.1*vf::sin( M_PI*vf::Px()/6.)*vf::N() ) \
    +                                                                   \
    addCL<cl::dirichlet_vec,cl::Fixe>( vf::one()-vf::one() )            \
    +                                                                   \
    addCL<cl::neumann_scal,cl::Exterieur>(vf::cst(0.) )                 \
    /**/
#endif
//-------------------------------------------------//
#if 0
#define STRUCT_U_EXTERIEUR(TIME)                          \
    (vf::sin( TIME*M_PI/(0.7*2.) )*0.1*vf::sin( M_PI*vf::Px()/6.)*vf::N() ) \
    /**/

#define STRUCT_DU1_DX(TIME)                     \
    (-vf::sin( TIME*M_PI/(0.7*2.) )*0.1*(M_PI/6.)*vf::cos( M_PI*vf::Px()/6.)*vf::Nx() ) \
    /**/
#define STRUCT_DU1_DX(TIME)                     \
    (-vf::sin( TIME*M_PI/(0.7*2.) )*0.1*(M_PI/6.)*vf::cos( M_PI*vf::Px()/6.)*vf::Nx() ) \
    /**/
#define STRUCT_D2U1_DXX(TIME)                                           \
    (vf::sin( TIME*M_PI/(0.7*2.) )*0.1*(M_PI*M_PI/36.)*vf::sin( M_PI*vf::Px()/6.)*vf::Nx() ) \
    /**/
#define STRUCT_D2U2_DXX(TIME)                                           \
    (vf::sin( TIME*M_PI/(0.7*2.) )*0.1*(M_PI*M_PI/36.)*vf::sin( M_PI*vf::Px()/6.)*vf::Ny() ) \
    /**/


#define STRUCT_DU2_DX(TIME)                     \
    (-vf::sin( TIME*M_PI/(0.7*2.) )*0.1*(M_PI/6.)*vf::cos( M_PI*vf::Px()/6.)*vf::Ny() ) \
    /**/
#define STRUCT_DU_DT(TIME)                     \
    (-( M_PI/(0.7*2.) )*vf::cos( TIME*M_PI/(0.7*2.) )*0.1*vf::sin( M_PI*vf::Px()/6.)*vf::N() ) \
    /**/
#define STRUCT_SIGMA(TIME)                                              \
    vf::mat<2,2>((lambda+2*mu)*STRUCT_DU1_DX(TIME),                     \
                 mu*STRUCT_DU2_DX(TIME),                                \
                 mu*STRUCT_DU2_DX(TIME),                                \
                 lambda*STRUCT_DU1_DX(TIME)                             \
                 )                                                      \
    /**/

#define STRUCT_DIV_SIGMA(TIME)                   \
    vf::vec( (lambda+2*mu)*STRUCT_D2U1_DXX(TIME), \
             mu*STRUCT_D2U2_DXX(TIME) )           \
    /**/

#define MECASOL_FORCE_VOLUMIQUE(TIME)           \
    STRUCT_DU_DT(TIME) - STRUCT_DIV_SIGMA(TIME)       \
    /**/

#define CL_DEF_MECASOL(TIME)                                            \
    addCL<cl::neumann_scal,cl::Interieur>( STRUCT_SIGMA(TIME) )         \
    +                                                                   \
    addCL<cl::dirichlet_vec,cl::Fixe>( vf::one()-vf::one() )            \
    +                                                                   \
    addCL<cl::dirichlet_vec,cl::Exterieur>( STRUCT_U_EXTERIEUR(TIME)  ) \
    /*addCL<cl::neumann_scal,cl::Exterieur>( STRUCT_SIGMA(TIME) vf::cst(0.) )*/ \
    /**/
#endif

//-------------------------------------------------//

#if 1
#define MECASOL_FORCE_VOLUMIQUE(TIME)                 \
    vf::vec( vf::cst(0.),vf::cst(0.) )                \
    /**/

#define CL_DEF_MECASOL(TIME)                                            \
    addCL<cl::neumann_scal,cl::Exterieur>( vf::cst(0.) )                \
    +                                                                   \
    addCL<cl::dirichlet_vec,cl::Fixe>( vf::one()-vf::one() )            \
    +                                                                   \
    addCL<cl::paroi_mobile,cl::Interieur>(vf::cst(0.) )                 \
    /**/
#endif
///////////////////////////////////////////////////////////////////




#endif /* __NS_CL_H */
